import axios from 'axios'
import {ElMessage} from 'element-plus'
import {APP_CONFIG} from '@/config'
import {useUserStore} from '@/stores/pages/user'
import NProgress from 'nprogress'

// 进度条控制（单例模式）
class ProgressManager {
    constructor() {
        this.loadingCount = 0
    }

    // 开始
    start() {
        if (this.loadingCount === 0) {
            NProgress.start()
        }
        this.loadingCount++
    }

    // 结束
    done() {
        this.loadingCount--
        if (this.loadingCount <= 0) {
            this.loadingCount = 0
            NProgress.done()
        }
    }
}

const progressManager = new ProgressManager()

// 创建 axios 实例
const request = axios.create({
    baseURL: APP_CONFIG.API_BASE_URL,
    timeout: 10000,
    //  统一凭证配置
    withCredentials: APP_CONFIG.AUTH_MODE === 'jwt-cookie'
})

// 请求拦截器
request.interceptors.request.use(
    (config) => {
        progressManager.start()

        // Mock模式标记
        if (APP_CONFIG.AUTH_MODE === 'mock') {
            config.headers['X-Request-Mode'] = 'mock'
        }
        if (APP_CONFIG.CSRF_PROTECTION) {
            config.headers['X-CSRF-TOKEN'] = getCsrfToken(); // 从localStorage获取CSRF Token
        }

        return config
    },
    (error) => {
        progressManager.done()
        handleRequestError(error)
        return Promise.reject(error)
    }
)

// 响应拦截器
request.interceptors.response.use(
    (response) => {
        progressManager.done()
        return response.data
    },
    (error) => {
        progressManager.done()
        return handleResponseError(error)
    }
)

//  统一错误处理函数
function handleRequestError(error) {
    console.error('[HTTP Request Error]', error)
    ElMessage({
        message: '请求发送失败，请检查网络连接',
        type: 'error',
        duration: 5000,
        showClose: true
    })
}

async function handleResponseError(error) {
    // 网络错误
    if (!error.response) {
        console.error('网络错误，请检查网络连接')
        ElMessage({
            message: '网络连接失败，请检查网络设置',
            type: 'error',
            duration: 5000,
            showClose: true
        })
        throw error
    }

    const {status, data} = error.response
    const errorMessage = data?.message || getDefaultErrorMessage(status)

    //  统一状态码处理
    switch (status) {
        case 401:
            console.warn('用户未授权，请重新登录')
            ElMessage.warning('登录已过期，请重新登录')

            // 清除认证状态
            try {
                const userStore = useUserStore()
                await userStore.logout()
            } catch (e) {
                console.error('Failed to get user store', e)
            }

            // 跳转到登录页（使用路由而非location.href）
            if (window.location.pathname !== '/auth/login') {
                window.location.href = '/auth/login'
            }
            break

        case 403:
            console.warn('访问被禁止')
            ElMessage.warning('您没有权限访问该资源')
            break

        case 404:
            //  自动降级到Mock模式
            if (APP_CONFIG.AUTH_MODE !== 'mock') {
                console.warn('接口未找到，使用模拟数据')
                ElMessage.warning('后端服务未启动，使用模拟数据')
            } else {
                ElMessage.warning('请求的资源不存在')
            }
            break

        case 500:
            console.error('服务器内部错误')
            ElMessage.error('服务器内部错误，请稍后再试')
            break

        default:
            console.error(`请求失败，状态码: ${status}`)
            ElMessage.error(errorMessage)
    }

    throw error
}

function getDefaultErrorMessage(status) {
    const messages = {
        400: '请求参数错误',
        401: '未授权访问',
        403: '访问被禁止',
        404: '资源不存在',
        500: '服务器内部错误',
        502: '网关错误',
        503: '服务不可用',
        504: '网关超时'
    }
    return messages[status] || `请求失败，状态码: ${status}`
}

export default request